<?php
//上一节的修改过后，发现如果新增加一个类型会很麻烦！
//需求：现在有一款格斗游戏，可在区块组成的格子中战斗!每个区块分别代表海洋(Sea)，平原(Plains)和深林(Forest)。但是可能还会有不同的星球，每个星球可能都不一样！比如（地球（Earth），火星(Mars)）
//如果按照上一节的做法，会很复杂，也不灵活。所以出现了抽象工厂的变形--原型模式

//版本一，工厂初始化的时候就需要所有对象，返回clone的对象就可以.相当于保存了所有具体产品的工厂类。好处是省略了很多工厂类（以前的做法是，产品不同的在工厂生成不同的对象）
class Sea{

}

class EarthSea extends Sea{

}

class MarsSea extends Sea{}

class Plains{}
class EarthPlains extends Plains{

}
class MarsPlains extends Plains{

}

class Forest{}
class EarthForest extends Forest{

}
class MarsForest extends Forest{

}


class TerrainFactory{
    private $sea;
    private $plains;
    private $forest;

    public function __construct(Sea $sea,Plains $plains,Forest $forest)
    {
        $this->sea = $sea;
        $this->plains = $plains;
        $this->forest = $forest;
    }

    public function getSea(){
        return clone $this->sea;
    }

    public function getPlains(){
        return clone $this->plains;
    }

    public function getForest(){
        return clone $this->forest;
    }
}


